#include <stdio.h>
#include "lexical.h"

unsigned int line_num_g = 1; //当前行号
unsigned int col_num_g = 0;  //当前字符列位置

char ch_g = '\0'; // 当前字符
char last_ch_g;

FILE *file = NULL;

/*

功能：扫描器
返回值：文件结束返回-1, 否则返回0 
关联全局变量：line_num_g, col_num_g, ch_g, ch_last_g

*/
int scan(void)
{
	static int line_len = 0;
	static int read_pos = 0;
	static char line_buf[MAX_LEN] = {0}; //fread 的行缓冲
	
	if(!file)	//文件已经关闭
		return END;
		
	if(!line_len)//缓冲区读取完毕
	{
		line_len = fread(line_buf, 1, MAX_LEN, file);//重新加载缓冲区数据
		if(line_len == 0)//没有数据了
		{
			
			line_len = 1; //结束也当成一个字符
			line_buf[0] = END; //标记文件结束
		}
		read_pos = 0;//恢复读取位置
	}

	last_ch_g = ch_g; 
	ch_g = line_buf[read_pos++];  //获取新的字符
	line_len--;
	

	/* 给行号多 1 打的补丁 */
	if(last_ch_g == '\n') { //新行
		line_num_g++;//行号累加
		col_num_g = 1;//列号复位
	} else {
		col_num_g++;	//列号递增
	}
	
	if(ch_g == END) { //文件结束，关闭
		fclose(file);
		file = NULL;
		return END;
	}

	return 0;
}


void show_ch(char ch)
{
	if(ch == -1)
		printf("EOF");
	else if(ch=='\n')
		printf("\\n");
	else if(ch=='\r')
		printf("\\r");	
	else if(ch=='\t')
		printf("\\t");
	else if(ch==' ')
		printf("<blank>");
	else 
		printf("%c",ch);	
	
	printf("\t\t<%d>\n",ch); // 打印ascii码
}
